<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>作用域</title>
    <script>
        /* 作用域 */
        /* 
        作用域
            作用域指一个变量的作用的范围
            在JS中有两种作用域
            1.全局作用域
                直接编写在script标签中的JS代码，都在全局作用域中
                全局作用域在页面打开时创建，页面关闭时销毁
                在全局作用域中有一个全局对象window，
                代表的时浏览器的窗口，由浏览器创建，可以直接使用
                在全局作用域中
                    创建的变量都会作为window对象的属性保存
                    创建的函数都会作为window对象的方法保存
                在全局作用域中的变量都是全局变量
                    在页面的任意的部分都可以访问的到
            2.函数作用域
                调用函数时创建函数作用域，函数执行完毕后，函数作用域销毁
                每调用一次函数就会创建一个新的函数作用域，他们之间时相互独立的
                在函数作用域中可以访问到全局作用域的变量
                但是函数中的变量，在全局作用域中访问不到
                当在函数作用域中操作一个变量是，会先在作用域中寻找，如果有则直接使用
                没有则向上一级作用域中寻找（不一定是全局中寻找）
                如果全局作用域中依然没有找到，则会报错ReferenceError
                函数中访问全局可以使用window对象
        */
        //全局作用域b
        var b = 123;

        function fun() {
            var a = 123;
        }
        fun();
        //a的作用域只是在函数内
        console.log(a); //is not undefined

        function fun() {
            console.log("我是fun函数");
        }
        //调用
        //fun();
        //window.fun(); //两者效果一样

        function fun3() {
            var
        }
        //调用
        func3();

        //创建一个变量

        var c = 10;

        function fun4() {

            var c = "我时函数中的c";
            console.log(c);
        }
        fun4();
        /* 
        在函数作用域中也存在函数提前的特性
        使用var关键字生命的变量会在函数中所有代码执行之前被声明
        函数声明也会在函数中所有代码执行之前执行
        */
        function fun5() {
            //console.log(a); //undefined
            //声明提前
            var a = 34;

            function fun6() {
                console.log("我是fun6");
            }
        }
        fun5();
        /* 
        在函数中不使用var声明的变量都会成为全局变量
        */
        var n = 33;

        function fun7() {
            console.log(n);
            var n = 10;
            t = 100; //相当于window.d =100;
        }
        fun7();

        //在全局输出n
        console.log(n);


        /* 
        定义形参就相当于在函数作用域中声明了变量
        */
        var e = 34;

        function fun8(e) {
            console.log(e);
        }
        fun8();
    </script>
</head>

<body>

</body>

</html>